<html>
<head><meta charset="utf-8"><title>collector collects optimized out promoteds · t-compiler/wg-mir-opt · Zulip Chat Archive</title></head>
<h2>Stream: <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/index.html">t-compiler/wg-mir-opt</a></h2>
<h3>Topic: <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html">collector collects optimized out promoteds</a></h3>

<hr>

<base href="https://rust-lang.zulipchat.com">

<head><link href="https://rust-lang.github.io/zulip_archive/style.css" rel="stylesheet"></head>

<a name="167456386"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/167456386" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#167456386">(Jun 06 2019 at 06:42)</a>:</h4>
<p>I haven't checked in detail, but reviewing <span class="user-mention" data-user-id="116266">@Santiago Pastorino</span> 's PR <a href="https://github.com/rust-lang/rust/pull/61554/commits/e786f631b815d171051279e0d6cfe055c75bec2e" target="_blank" title="https://github.com/rust-lang/rust/pull/61554/commits/e786f631b815d171051279e0d6cfe055c75bec2e">https://github.com/rust-lang/rust/pull/61554/commits/e786f631b815d171051279e0d6cfe055c75bec2e</a> made me realize that we are collecting all <code>promoted</code>s of a <code>mir::Body</code>, even if they are completely unused (e.g. due to const prop optimizing <code>*&amp;1</code> to <code>1</code>). I'm not sure how to test this, I think I've seen some sort of tests that check for items ending up in the final binary and we may already have promoted tests there. So we should make such a test with mir optimizations enabled, see whether dead promoteds end up in there and then fix it</p>



<a name="167456400"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/167456400" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#167456400">(Jun 06 2019 at 06:42)</a>:</h4>
<p>Most likely the fix is to implement <code>PlaceBase::Static(box Static{ kind:StaticKind::Promoted...</code> where we currently have <code>StaticKind::Static</code> in <code>collector.rs</code></p>



<a name="171523311"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171523311" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171523311">(Jul 23 2019 at 14:25)</a>:</h4>
<p><span class="user-mention" data-user-id="214307">@Saleem Jaffer</span> this could be an immediate gain, because llvm would need to do less work</p>



<a name="171528422"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171528422" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171528422">(Jul 23 2019 at 15:21)</a>:</h4>
<p>I'll pick this up.</p>



<a name="171937391"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171937391" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171937391">(Jul 29 2019 at 11:27)</a>:</h4>
<p><a href="https://github.com/saleemjaffer/rust/blob/745c76d657ebbe29265100e5381f8bf326c54567/src/librustc_mir/monomorphize/collector.rs#L664" target="_blank" title="https://github.com/saleemjaffer/rust/blob/745c76d657ebbe29265100e5381f8bf326c54567/src/librustc_mir/monomorphize/collector.rs#L664">https://github.com/saleemjaffer/rust/blob/745c76d657ebbe29265100e5381f8bf326c54567/src/librustc_mir/monomorphize/collector.rs#L664</a> is the only place in <code>collector.rs</code> where <code>StaticKind::Static</code> exists. How do I proceed with this?</p>



<a name="171937467"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171937467" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171937467">(Jul 29 2019 at 11:28)</a>:</h4>
<p>Also <span class="user-mention" data-user-id="124288">@oli</span> could you explain this a bit</p>
<blockquote>
<p>made me realize that we are collecting all promoteds of a mir::Body, even if they are completely unused (e.g. due to const prop optimizing *&amp;1 to 1)</p>
</blockquote>
<p>If you can explain/guide me to some links about const prop that would be helpful.</p>



<a name="171942271"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171942271" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171942271">(Jul 29 2019 at 12:49)</a>:</h4>
<p><span class="user-mention" data-user-id="214307">@Saleem Jaffer</span> const prop is here <a href="https://github.com/rust-lang/rust/blob/8b94e9e9188b65df38a5f1ae723617dc2dfb3155/src/librustc_mir/transform/const_prop.rs" target="_blank" title="https://github.com/rust-lang/rust/blob/8b94e9e9188b65df38a5f1ae723617dc2dfb3155/src/librustc_mir/transform/const_prop.rs">https://github.com/rust-lang/rust/blob/8b94e9e9188b65df38a5f1ae723617dc2dfb3155/src/librustc_mir/transform/const_prop.rs</a></p>



<a name="171942478"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171942478" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171942478">(Jul 29 2019 at 12:52)</a>:</h4>
<p>I believe what <span class="user-mention" data-user-id="124288">@oli</span>  is saying is that if you have something like this:</p>
<div class="codehilite"><pre><span></span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"></span>
<span class="kd">let</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w"></span>

<span class="kd">let</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">y</span><span class="p">;</span><span class="w"></span>
</pre></div>


<p>Const promotion will do this:</p>
<div class="codehilite"><pre><span></span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_promoted</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span><span class="w"></span>
<span class="kd">let</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_promoted</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span><span class="w"></span>

<span class="kd">let</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">y</span><span class="p">;</span><span class="w"></span>
</pre></div>


<p>but then const prop will notice that you're adding constants and do that for you creating another promoted:</p>
<div class="codehilite"><pre><span></span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_promoted</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span><span class="w"></span>
<span class="kd">let</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_promoted</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span><span class="w"></span>

<span class="kd">let</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_promoted</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span><span class="w"> </span><span class="c1">//3</span>
</pre></div>


<p>but now we're not really using <code>_promoted[0]</code> or <code>_promoted[1]</code> anymore</p>



<a name="171942485"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171942485" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171942485">(Jul 29 2019 at 12:52)</a>:</h4>
<p>So we don't really need to spend the time &amp; cpu cycles to collect them</p>



<a name="171942504"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171942504" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171942504">(Jul 29 2019 at 12:52)</a>:</h4>
<p>(Technically this is a bad example because assigning the value to a variable is considered a use, but I think you get the general idea)</p>



<a name="171945827"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171945827" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171945827">(Jul 29 2019 at 13:37)</a>:</h4>
<p><span class="user-mention" data-user-id="125250">@Wesley Wiser</span> So does this mean that there would be no <code>promoted[0]</code> and <code>promoted[1]</code>, but a single promoted for the result of <code>1 + 2</code>, i.e. <code>3</code> wrt the example you mentioned?</p>



<a name="171948455"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171948455" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171948455">(Jul 29 2019 at 14:09)</a>:</h4>
<p><span class="user-mention" data-user-id="214307">@Saleem Jaffer</span> Yeah</p>



<a name="171948569"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171948569" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171948569">(Jul 29 2019 at 14:10)</a>:</h4>
<p>Currently though, we don't do anything to avoid collecting unused promoteds so for values that are no longer needed after optimization, we still collect them.</p>



<a name="171948578"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171948578" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171948578">(Jul 29 2019 at 14:10)</a>:</h4>
<p>At least, that's my understanding</p>



<a name="171954093"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171954093" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171954093">(Jul 29 2019 at 15:10)</a>:</h4>
<p>Thanks for explaining :)</p>



<a name="171964318"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171964318" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171964318">(Jul 29 2019 at 17:06)</a>:</h4>
<p>It's even simpler than that. <code>*&amp;1</code> will create a promoted for the <code>1</code>, const prop turns the entire expression into a constant <code>1</code> and we still collect the promoted</p>



<a name="171964348"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171964348" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171964348">(Jul 29 2019 at 17:07)</a>:</h4>
<p>Variables are a bit messy, as <span class="user-mention" data-user-id="125250">@Wesley Wiser</span> noted</p>



<a name="171964473"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171964473" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171964473">(Jul 29 2019 at 17:09)</a>:</h4>
<p>So as a repro, having a library with just <code>pub fn foo() -&gt; i32 { *&amp;1 }</code> should not cause any promoted to be collected, but right now it does</p>



<a name="171964794"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171964794" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171964794">(Jul 29 2019 at 17:13)</a>:</h4>
<p><span class="user-mention" data-user-id="124288">@oli</span>  By “collection” do you mean use the promoted for the LLVM representation?</p>



<a name="171964870"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171964870" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171964870">(Jul 29 2019 at 17:14)</a>:</h4>
<p>And also, I checked in <a href="http://collector.rs" target="_blank" title="http://collector.rs">collector.rs</a>. There is only usage site. So how do I proceed with the issue?</p>



<a name="171966404"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171966404" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171966404">(Jul 29 2019 at 17:33)</a>:</h4>
<p>Also, in the small example that you mentioned, will there be 2 collections? One for the promoted and the other for the constant?</p>



<a name="171978496"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171978496" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171978496">(Jul 29 2019 at 20:01)</a>:</h4>
<p>Yes, the constant one is fine</p>



<a name="171978518"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171978518" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171978518">(Jul 29 2019 at 20:01)</a>:</h4>
<p><a href="http://Collector.rs" target="_blank" title="http://Collector.rs">Collector.rs</a> accesses the promoted vector</p>



<a name="171978579"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171978579" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171978579">(Jul 29 2019 at 20:02)</a>:</h4>
<p>That use site should be removed</p>



<a name="171978594"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171978594" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171978594">(Jul 29 2019 at 20:02)</a>:</h4>
<p>And a new one added in visit static</p>



<a name="171978644"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171978644" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171978644">(Jul 29 2019 at 20:03)</a>:</h4>
<p>Or visit place? I don't remember</p>



<a name="171978662"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171978662" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171978662">(Jul 29 2019 at 20:03)</a>:</h4>
<p>Wherever we match on StaticKind</p>



<a name="171978677"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/171978677" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#171978677">(Jul 29 2019 at 20:04)</a>:</h4>
<p>Do an exhaustive match</p>



<a name="172004928"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172004928" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172004928">(Jul 30 2019 at 04:45)</a>:</h4>
<p>This is the code in <a href="http://collector.rs" target="_blank" title="http://collector.rs">collector.rs</a></p>
<div class="codehilite"><pre><span></span><span class="k">fn</span> <span class="nf">visit_place_base</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"></span>
<span class="w">                        </span><span class="n">place_base</span>: <span class="kp">&amp;</span><span class="nc">mir</span>::<span class="n">PlaceBase</span><span class="o">&lt;</span><span class="na">&#39;tcx</span><span class="o">&gt;</span><span class="p">,</span><span class="w"></span>
<span class="w">                        </span><span class="n">_context</span>: <span class="nc">mir</span>::<span class="n">visit</span>::<span class="n">PlaceContext</span><span class="p">,</span><span class="w"></span>
<span class="w">                        </span><span class="n">location</span>: <span class="nc">Location</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">        </span><span class="k">match</span><span class="w"> </span><span class="n">place_base</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">            </span><span class="n">PlaceBase</span>::<span class="n">Static</span><span class="p">(</span><span class="k">box</span><span class="w"> </span><span class="n">Static</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">kind</span>: <span class="nc">StaticKind</span>::<span class="n">Static</span><span class="p">(</span><span class="n">def_id</span><span class="p">),</span><span class="w"> </span><span class="p">..</span><span class="w"> </span><span class="p">})</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                </span><span class="n">debug</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;visiting static {:?} @ {:?}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">def_id</span><span class="p">,</span><span class="w"> </span><span class="n">location</span><span class="p">);</span><span class="w"></span>

<span class="w">                </span><span class="kd">let</span><span class="w"> </span><span class="n">tcx</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">tcx</span><span class="p">;</span><span class="w"></span>
<span class="w">                </span><span class="kd">let</span><span class="w"> </span><span class="n">instance</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Instance</span>::<span class="n">mono</span><span class="p">(</span><span class="n">tcx</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">def_id</span><span class="p">);</span><span class="w"></span>
<span class="w">                </span><span class="k">if</span><span class="w"> </span><span class="n">should_monomorphize_locally</span><span class="p">(</span><span class="n">tcx</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">instance</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                    </span><span class="bp">self</span><span class="p">.</span><span class="n">output</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">MonoItem</span>::<span class="n">Static</span><span class="p">(</span><span class="o">*</span><span class="n">def_id</span><span class="p">));</span><span class="w"></span>
<span class="w">                </span><span class="p">}</span><span class="w"></span>
<span class="w">            </span><span class="p">}</span><span class="w"></span>
<span class="w">            </span><span class="n">PlaceBase</span>::<span class="n">Static</span><span class="p">(</span><span class="k">box</span><span class="w"> </span><span class="n">Static</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">kind</span>: <span class="nc">StaticKind</span>::<span class="n">Promoted</span><span class="p">(</span><span class="n">_</span><span class="p">),</span><span class="w"> </span><span class="p">..</span><span class="w"> </span><span class="p">})</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                </span><span class="c1">// FIXME: should we handle promoteds here instead of eagerly in collect_neighbours?</span>
<span class="w">            </span><span class="p">}</span><span class="w"></span>
<span class="w">            </span><span class="n">PlaceBase</span>::<span class="n">Local</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                </span><span class="c1">// Locals have no relevance for collector</span>
<span class="w">            </span><span class="p">}</span><span class="w"></span>
<span class="w">        </span><span class="p">}</span><span class="w"></span>
<span class="w">    </span><span class="p">}</span><span class="w"></span>
</pre></div>


<p>There already is an exhaustive match on <code>StaticKind</code> here. Should I handle the <code>FIXME</code> part?</p>



<a name="172009354"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172009354" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172009354">(Jul 30 2019 at 06:30)</a>:</h4>
<p>yes <span aria-label="laughing" class="emoji emoji-1f606" role="img" title="laughing">:laughing:</span> Great that there's a FIXME there</p>



<a name="172025903"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172025903" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172025903">(Jul 30 2019 at 10:49)</a>:</h4>
<p>(deleted)</p>



<a name="172122688"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172122688" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172122688">(Jul 31 2019 at 12:36)</a>:</h4>
<p><span class="user-mention" data-user-id="124288">@oli</span> <br>
From what I understand we need to do something like this (This code does not compile):</p>
<div class="codehilite"><pre><span></span><span class="k">fn</span> <span class="nf">visit_place_base</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"></span>
<span class="w">                        </span><span class="n">place_base</span>: <span class="kp">&amp;</span><span class="nc">mir</span>::<span class="n">PlaceBase</span><span class="o">&lt;</span><span class="na">&#39;tcx</span><span class="o">&gt;</span><span class="p">,</span><span class="w"></span>
<span class="w">                        </span><span class="n">_context</span>: <span class="nc">mir</span>::<span class="n">visit</span>::<span class="n">PlaceContext</span><span class="p">,</span><span class="w"></span>
<span class="w">                        </span><span class="n">location</span>: <span class="nc">Location</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">        </span><span class="k">match</span><span class="w"> </span><span class="n">place_base</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">            </span><span class="n">PlaceBase</span>::<span class="n">Static</span><span class="p">(</span><span class="k">box</span><span class="w"> </span><span class="n">Static</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">kind</span>: <span class="nc">StaticKind</span>::<span class="n">Static</span><span class="p">(</span><span class="n">def_id</span><span class="p">),</span><span class="w"> </span><span class="p">..</span><span class="w"> </span><span class="p">})</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                </span><span class="n">debug</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;visiting static {:?} @ {:?}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">def_id</span><span class="p">,</span><span class="w"> </span><span class="n">location</span><span class="p">);</span><span class="w"></span>

<span class="w">                </span><span class="kd">let</span><span class="w"> </span><span class="n">tcx</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">tcx</span><span class="p">;</span><span class="w"></span>
<span class="w">                </span><span class="kd">let</span><span class="w"> </span><span class="n">instance</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Instance</span>::<span class="n">mono</span><span class="p">(</span><span class="n">tcx</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">def_id</span><span class="p">);</span><span class="w"></span>
<span class="w">                </span><span class="k">if</span><span class="w"> </span><span class="n">should_monomorphize_locally</span><span class="p">(</span><span class="n">tcx</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">instance</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                    </span><span class="bp">self</span><span class="p">.</span><span class="n">output</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">MonoItem</span>::<span class="n">Static</span><span class="p">(</span><span class="o">*</span><span class="n">def_id</span><span class="p">));</span><span class="w"></span>
<span class="w">                </span><span class="p">}</span><span class="w"></span>
<span class="w">            </span><span class="p">}</span><span class="w"></span>
<span class="w">            </span><span class="n">PlaceBase</span>::<span class="n">Static</span><span class="p">(</span><span class="k">box</span><span class="w"> </span><span class="n">Static</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">kind</span>: <span class="nc">StaticKind</span>::<span class="n">Promoted</span><span class="p">(</span><span class="n">_</span><span class="p">),</span><span class="w"> </span><span class="p">..</span><span class="w"> </span><span class="p">})</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                </span><span class="k">match</span><span class="w"> </span><span class="n">tcx</span><span class="p">.</span><span class="n">const_eval</span><span class="p">(</span><span class="n">param_env</span><span class="p">.</span><span class="n">and</span><span class="p">(</span><span class="n">cid</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                    </span><span class="nb">Ok</span><span class="p">(</span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">collect_const</span><span class="p">(</span><span class="n">tcx</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">instance</span><span class="p">.</span><span class="n">substs</span><span class="p">,</span><span class="w"> </span><span class="n">output</span><span class="p">),</span><span class="w"></span>
<span class="w">                    </span><span class="nb">Err</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{},</span><span class="w"></span>
<span class="w">                </span><span class="p">}</span><span class="w"></span>
<span class="w">            </span><span class="p">}</span><span class="w"></span>
<span class="w">            </span><span class="n">PlaceBase</span>::<span class="n">Local</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">                </span><span class="c1">// Locals have no relevance for collector</span>
<span class="w">            </span><span class="p">}</span><span class="w"></span>
<span class="w">        </span><span class="p">}</span><span class="w"></span>
<span class="w">    </span><span class="p">}</span><span class="w"></span>
</pre></div>



<a name="172122768"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172122768" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172122768">(Jul 31 2019 at 12:37)</a>:</h4>
<p>Basically, I guess in the promoted arm we need to do a <code>const_eval</code> to check whether const prop turns the promoted to a constant?</p>
<p>In case of the <code>Ok</code> we do a <code>collect_const</code>, but I do not know how do we stop the collector from collecting the promoted.</p>



<a name="172125687"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172125687" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172125687">(Jul 31 2019 at 13:11)</a>:</h4>
<p>Hmmm curious. You're right, the collector can const eval, because it's monomorphic. What does the current promotion collection code do? You should be able to copy that</p>



<a name="172125696"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172125696" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172125696">(Jul 31 2019 at 13:11)</a>:</h4>
<p>I think we can unwrap the const eval call</p>



<a name="172125960"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172125960" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172125960">(Jul 31 2019 at 13:14)</a>:</h4>
<p><a href="https://github.com/saleemjaffer/rust/blob/745c76d657ebbe29265100e5381f8bf326c54567/src/librustc_mir/monomorphize/collector.rs#L1237" target="_blank" title="https://github.com/saleemjaffer/rust/blob/745c76d657ebbe29265100e5381f8bf326c54567/src/librustc_mir/monomorphize/collector.rs#L1237">https://github.com/saleemjaffer/rust/blob/745c76d657ebbe29265100e5381f8bf326c54567/src/librustc_mir/monomorphize/collector.rs#L1237</a></p>



<a name="172125964"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172125964" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172125964">(Jul 31 2019 at 13:14)</a>:</h4>
<p>Do that</p>



<a name="172125966"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172125966" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172125966">(Jul 31 2019 at 13:14)</a>:</h4>
<p>XD</p>



<a name="172125976"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172125976" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> oli <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172125976">(Jul 31 2019 at 13:14)</a>:</h4>
<p>And then remove that for loop</p>



<a name="172126148"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172126148" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Saleem Jaffer <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172126148">(Jul 31 2019 at 13:16)</a>:</h4>
<p>What's "monomorphic"? I've seen this a lot in the mir code.</p>



<a name="172128386"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172128386" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172128386">(Jul 31 2019 at 13:44)</a>:</h4>
<p>Haskell wiki has a rather concise definition <a href="https://wiki.haskell.org/Monomorphism" target="_blank" title="https://wiki.haskell.org/Monomorphism">https://wiki.haskell.org/Monomorphism</a></p>



<a name="172128434"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172128434" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172128434">(Jul 31 2019 at 13:45)</a>:</h4>
<p>In Rust, a function is monomorphic if it doesn't have any (remaining) const generic parameters, type parameters, or lifetimes.</p>



<a name="172128586"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/189540-t-compiler/wg-mir-opt/topic/collector%20collects%20optimized%20out%20promoteds/near/172128586" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Wesley Wiser <a href="https://rust-lang.github.io/zulip_archive/stream/189540-t-compiler/wg-mir-opt/topic/collector.20collects.20optimized.20out.20promoteds.html#172128586">(Jul 31 2019 at 13:47)</a>:</h4>
<p>So</p>
<div class="codehilite"><pre><span></span><span class="k">fn</span> <span class="nf">example</span><span class="o">&lt;</span><span class="na">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
</pre></div>


<p>is polymorphic</p>
<p>but this instance of the function:</p>
<div class="codehilite"><pre><span></span><span class="n">example</span><span class="o">&lt;</span><span class="nb">&#39;static</span><span class="p">,</span><span class="w"> </span><span class="kt">u8</span><span class="o">&gt;</span><span class="p">();</span><span class="w"></span>
</pre></div>


<p>is monomorphic.</p>



<hr><p>Last updated: Aug 07 2021 at 22:04 UTC</p>
</html>